home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et3_0-a1.lha / et3 / src / Class.h < prev    next >
C/C++ Source or Header  |  1992-04-27  |  7KB  |  185 lines

  1. #ifndef Class_First
  2. #ifdef __GNUG__
  3. //pragma once
  4. #pragma interface
  5. #endif
  6. #define Class_First
  7.  
  8. #include "Object.h"
  9.  
  10. enum ClassFlags {
  11.     eClassAbstract  =   BIT(eObjLast + 1),      // abstract class
  12.     eClassObject    =   BIT(eObjLast + 2),      // ???
  13.     eClassLast      =   eObjLast + 2
  14. };
  15.  
  16. //---- Class -------------------------------------------------------------------
  17.  
  18. class Class: public Object {
  19.     static class Class *classptr;
  20.     
  21.     Class *super;
  22.     char *className, *version, *declFileName, *implFileName;
  23.     Object *proto;
  24.     int myId, size, declFileLine, implFileLine, instanceCount;
  25.     class OrdCollection* subclasses;
  26.     class Collection *methods;
  27.  
  28. public:
  29.     MetaDef(Class);
  30.     Class(char *name, int sz, Object *pro, char *in, char *dn, int il,
  31.                             int dl, bool abstract);
  32.     Class(char *name, char *vers);
  33.     ~Class();
  34.     
  35.     //---- attributes
  36.     char *Name() const
  37.     { return className; }
  38.     int Size() const
  39.     { return size; }
  40.     bool IsAbstract()
  41.     { return TestFlag(eClassAbstract); }
  42.     Object *Proto() const
  43.     { return proto; }
  44.     OrdCollection *SubClasses()
  45.     { return subclasses; }
  46.     
  47.     //---- class hierarchy
  48.     Class *Super() const
  49.     { return super; }
  50.     Class *SetSuper();
  51.     bool isKindOf(Class*);
  52.     void AddSubclass(Class*);
  53.     class Iterator *SubclassIterator();
  54.  
  55.     //---- comparing
  56.     u_long Hash();
  57.     bool IsEqual(Object*);
  58.     int Compare(Object*);
  59.  
  60.     //---- converting, input/output
  61.     char* AsString();
  62.     virtual void Show(char *buf, void *addr, int len, bool isptr);
  63.     OStream& PrintOn(OStream&);
  64.     Object *ReadAndMap(IStream&);
  65.  
  66.     //---- members
  67.     Object *SomeMember();
  68.     void EnumerateMembers(AccessMembers *accessor= 0);
  69.     void EnumerateMyMembers(AccessMembers *accessor= 0);
  70.     
  71.     //---- methods
  72.     Collection *GetMethods()
  73.     { return methods; }
  74.     void SetMethods(Collection *col)
  75.     { methods= col; }
  76.  
  77.     //---- source access
  78.     const char *GetDeclFileName()
  79.     { return declFileName; }
  80.     const char *GetImplFileName()
  81.     { return implFileName; }   
  82.     int GetImplFileLine()
  83.     { return implFileLine; }
  84.     int GetDeclFileLine()
  85.     { return declFileLine; }
  86.  
  87.     //---- instance statistics
  88.     Object *SomeInstance();
  89.     void AddInstance()
  90.     { instanceCount++; }
  91.     int  GetInstanceCount()
  92.     { return instanceCount; }
  93.     void ResetInstanceCount()
  94.     { instanceCount= 0; }
  95. };
  96.  
  97. //---- SimpleMetaImpl macros ---------------------------------------------------
  98.  
  99. #define _SimpleMetaImpl(name,printname)                                     \
  100.     class _NAME2_(name,Class): public Class {                               \
  101.     public:                                                                 \
  102.     _NAME2_(name,Class)() : Class(_QUOTE_(printname), sizeof(name), 0,  \
  103.         __FILE__, __FILE__, __LINE__,                                   \
  104.         __LINE__, FALSE)                                                \
  105.         { }                                                             \
  106.     void Show(char *buf, void *addr, int len, bool isptr);              \
  107.     };                                                                      \
  108.     static _NAME2_(name,Class) _NAME2_(name,ClassMetaImpl0);                \
  109.     Class *SMeta(name)= &_NAME2_(name,ClassMetaImpl0);                      \
  110.     void _NAME2_(name,Class)::Show(char *buf, void *addr, int len, bool isptr)
  111.  
  112. #define SimpleMetaImpl(name)      _SimpleMetaImpl(name,name)
  113.  
  114. //---- MetaImpl macros ---------------------------------------------------------
  115.  
  116. #define _MetaImpl0(name,super,abstract)                                     \
  117. Class *name::isa;                                                           \
  118.     static Class _NAME2_(name,ClassMetaImpl0)(_QUOTE_(name), sizeof(name),  \
  119.     new name((class _dummy*)0),                                             \
  120.     __FILE__,                                                               \
  121.     _NAME2_(name,DeclFileName)(),                                           \
  122.     __LINE__,                                                               \
  123.     _NAME2_(name,DeclFileLine)(),                                           \
  124.     abstract);                                                              \
  125. name::name(class _dummy *d) : super(d)                                      \
  126.     { isa= _NAME2_(name,ClassMetaImpl0).SetSuper(); }                       \
  127. Class *name::IsA()                                                          \
  128.     { return &_NAME2_(name,ClassMetaImpl0); }
  129.  
  130. #define MetaImpl0(name)     \
  131. _MetaImpl0(name,,FALSE)      \
  132. void name::Members(AccessMembers *) { } 
  133.     
  134. #define MetaImpl(name,list) \
  135. _MetaImpl0(name,,FALSE)      \
  136. void name::Members(AccessMembers *ac) { _accessMembers= ac; ScanMembers list; }
  137.  
  138. #define AbstractMetaImpl0(name) \
  139. _MetaImpl0(name,,TRUE)       \
  140. void name::Members(AccessMembers *) { }
  141.  
  142. #define AbstractMetaImpl(name,list) \
  143. _MetaImpl0(name,,TRUE)       \
  144. void name::Members(AccessMembers *ac) { _accessMembers= ac; ScanMembers list; }
  145.  
  146.  
  147. #define NewMetaImpl0(name,super)            \
  148. _MetaImpl0(name,super,FALSE)                \
  149. void name::Members(AccessMembers *) { } 
  150.     
  151. #define NewMetaImpl(name,super,list)        \
  152. _MetaImpl0(name,super,FALSE)                \
  153. void name::Members(AccessMembers *ac) { _accessMembers= ac; ScanMembers list; }
  154.  
  155. #define NewAbstractMetaImpl0(name,super)    \
  156. _MetaImpl0(name,super,TRUE)                 \
  157. void name::Members(AccessMembers *) { }
  158.  
  159. #define NewAbstractMetaImpl(name,super,list)    \
  160. _MetaImpl0(name,super,TRUE)                     \
  161. void name::Members(AccessMembers *ac) { _accessMembers= ac; ScanMembers list; }
  162.  
  163. //---- type specifiers for metaclass macros ------------------------------------
  164.  
  165. #define _offset(in) (u_long)&in
  166. #define _aoffset(in) (u_long)in
  167. #define _TO(x) _Type(TYPEOF(x))
  168.  
  169. #define TC(in,cast) (_an++,T_SIM), _QUOTE_(in), _Type((cast*)&in),  _offset(in)
  170.  
  171. #define T(in)       (_an++,T_SIM), _QUOTE_(in), _Type(&in),  _offset(in)
  172.  
  173. #define TP(in)      (_an++,T_PTR), _QUOTE_(in), _Type(in),   _offset(in)
  174. #define TS(in)      (_an++,T_STR), _QUOTE_(in), _Type(in),   _offset(in)
  175. #define TA(in)      (_an++,T_ARR), _QUOTE_(in), _Type(in),   _aoffset(in),   sizeof(in)/sizeof(*in)
  176. #define TV(in,len)  (_an++,T_VEC), _QUOTE_(in), _Type(in),   _offset(in),    _offset(len)
  177.  
  178. #define TPP(in)     (_an++,T_PTR+T_PTR2), _QUOTE_(in), _TO(in), _offset(in)
  179. #define TSP(in)     (_an++,T_STR+T_PTR2), _QUOTE_(in), _TO(in), _offset(in)
  180. #define TAP(in)     (_an++,T_ARR+T_PTR2), _QUOTE_(in), _TO(in), _aoffset(in), sizeof(in)/sizeof(*in)
  181. #define TVP(in,len) (_an++,T_VEC+T_PTR2), _QUOTE_(in), _TO(in), _offset(in), _offset(len)
  182.  
  183.  
  184. #endif
  185.